import html2Canvas from 'html2canvas';
import JsPDF from 'jspdf';
import { PDFDocument } from 'pdf-lib';
export async function htmlToPdf(name, title) {
    const ele = document.querySelector('#' + name);
    const eleW = ele.offsetWidth; // 获得该容器的宽
    const eleH = ele.offsetHeight; // 获得该容器的高

    const eleOffsetTop = ele.offsetTop; // 获得该容器到文档顶部的距离
    const eleOffsetLeft = ele.offsetLeft; // 获得该容器到文档最左的距离

    var canvas = document.createElement('canvas');
    var abs = 0;

    const win_in = document.documentElement.clientWidth || document.body.clientWidth; // 获得当前可视窗口的宽度（不包含滚动条）
    const win_out = window.innerWidth; // 获得当前窗口的宽度（包含滚动条）

    if (win_out > win_in) {
        // abs = (win_o - win_i)/2;    // 获得滚动条长度的一半
        abs = (win_out - win_in) / 2; // 获得滚动条宽度的一半
        // console.log(a, '新abs');
    }

    canvas.width = eleW * 2; // 将画布宽&&高放大两倍
    canvas.height = eleH * 2;

    var context = canvas.getContext('2d');

    context.scale(2, 2);

    context.translate(-eleOffsetLeft - abs, -eleOffsetTop);
    // 这里默认横向没有滚动条的情况，因为offset.left(),有无滚动条的时候存在差值，因此
    // translate的时候，要把这个差值去掉

    var pdf = new JsPDF('landscape', 'pt', 'a4'); // 方向 landscape 横向，portrait 纵向，单位 pt，大小 a4
    const childrenBox = ele.children;
    for (let i = 0; i < childrenBox.length; i++) {
        // 循环传过来的Dom的字节点 每个子节点打印成一页pdf A4纸那么大
        console.log(childrenBox, 'childrenBox');
        console.log(1111);
        const res = await html2Canvas(childrenBox[i], {
            dpi: 300,
            // allowTaint: true,  //允许 canvas 污染， allowTaint参数要去掉，否则是无法通过toDataURL导出canvas数据的
            useCORS: true, // 允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
            scale: 4 // 提升导出的文件的分辨率
        });
        var pageData = res.toDataURL('image/jpeg', 1.0);
        var contentWidth = res.width;
        var contentHeight = res.height;
        var imgWidth = 555.28;
        var imgHeight = (552.28 / contentWidth) * contentHeight;
        pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight);
        if (i < childrenBox.length - 1) {
            pdf.addPage(); // 避免最后多一个空白页
        }
    }

    pdf.save(`${title}.pdf`);
}

export async function exportToPDF(tableSelector, title) {
    // 创建一个空白的 PDF 文档
    const pdfDoc = await PDFDocument.create();
    const page = pdfDoc.addPage();

    // 使用 html2canvas 将表格和图表转换为画布（canvas）
    const tableCanvas = await html2Canvas(tableSelector).then((canvas) => canvas.toDataURL());

    // 将画布内容添加到 PDF 文档中
    const tableImage = await pdfDoc.embedPng(tableCanvas);

    const { width, height } = page.getSize();
    const tableWidth = tableCanvas.width / width;

    page.drawImage(tableImage, {
        x: 0,
        y: 0,
        width: tableWidth,
        height: tableCanvas.height / height
    });

    // 保存 PDF 文档到文件
    const pdfBytes = await pdfDoc.save();
    const data = new Blob([pdfBytes], { type: 'application/pdf' });
    const pdfUrl = URL.createObjectURL(data);

    // 使用 <a> 标签下载 PDF
    const link = document.createElement('a');
    link.href = pdfUrl;
    link.download = `${title}.pdf`;
    link.click();
}
export async function downloadPDF(contentHtml, title) {
    const doc = new JsPDF('p', 'pt', 'a4');
    console.log(contentHtml, 'contentHtml');
    await doc.html(contentHtml, {
        callback: function (doc) {
            doc.save(`${title}.pdf`);
        },
        x: 10,
        y: 10
    });
}

export async function mergePdfs(pdfBuffer1, pdfBuffer2) {
    // 将Buffer转换为Uint8Array
    const pdfDoc1 = await PDFDocument.load(pdfBuffer1);
    const pdfDoc2 = await PDFDocument.load(pdfBuffer2);

    // 创建一个新的PDF并将两个PDF的内容合并
    const mergedPdf = await PDFDocument.create();
    const mergedCopies = await mergedPdf.copyPages(pdfDoc1, pdfDoc1.getPageIndices());

    mergedCopies.forEach((page) => {
        mergedPdf.addPage(page);
    });

    const mergedCopies2 = await mergedPdf.copyPages(pdfDoc2, pdfDoc2.getPageIndices());

    mergedCopies2.forEach((page) => {
        mergedPdf.addPage(page);
    });
    // 将合并后的PDF转换为Buffer
    const mergedPdfFile = await mergedPdf.save();
    return mergedPdfFile;
}

/**
 * 地址转base64
 * @param url
 * @returns {Promise<unknown>}
 */
export async function urlToBase64(url) {
    // await new Promise( (resolve,reject) => {
    //     fetch(url).then((response) => response.blob())
    //         .then(result => resolve(result))
    //         .catch(error => reject(error));
    // });
    try {
        const blob = await fetch(url).then((response) => response.arrayBuffer());
        return blob;
    } catch (error) {
        console.error('Error fetching PDF:', error);
        return null;
    }
    // return await new Promise(async (resolve, reject) => {
    //     await fetch(url)
    //         .then((response) => response.blob())
    //         .then((blob) => {
    //             resolve(blob);
    //         })
    //         .catch(() => {
    //             resolve();
    //         });
    // });
}
